package com.im.tcp.redis;

import com.im.common.config.BootstrapConfig;
import org.apache.commons.lang3.StringUtils;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.StringCodec;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;

/**
 * 单机 Redis 客户端连接配置策略类
 */
public class SingleClientStrategy {

    /**
     * 获取 RedissonClient 实例，用于连接 Redis 服务器
     *
     * @param redisConfig Redis 配置
     * @return RedissonClient 实例
     */
    public RedissonClient getRedissonClient(BootstrapConfig.RedisConfig redisConfig) {
        Config config = new Config(); // Redisson 客户端配置
        String node = redisConfig.getSingle().getAddress(); // 获取 Redis 单机节点的地址
        node = node.startsWith("redis://") ? node : "redis://" + node; // 若地址没有以 "redis://" 开头，则添加
        SingleServerConfig serverConfig = config.useSingleServer() // 设置 Redisson 使用的单机节点配置
                .setAddress(node) // 设置单机节点地址
                .setDatabase(redisConfig.getDatabase()) // 设置 Redis 数据库编号
                .setTimeout(redisConfig.getTimeout()) // 设置 Redis 连接超时时间
                .setConnectionMinimumIdleSize(redisConfig.getPoolMinIdle()) // 设置连接池最小空闲连接数
                .setConnectTimeout(redisConfig.getPoolConnTimeout()) // 设置连接池连接超时时间
                .setConnectionPoolSize(redisConfig.getPoolSize()); // 设置连接池大小
        if (StringUtils.isNotBlank(redisConfig.getPassword())) { // 若 Redis 配置中设置了密码，则设置连接密码
            serverConfig.setPassword(redisConfig.getPassword());
        }
        StringCodec stringCodec = new StringCodec(); // 设置 Redisson 序列化/反序列化的编码方式
        config.setCodec(stringCodec);
        return Redisson.create(config); // 创建 RedissonClient 实例并返回
    }

}
